package ar.com.javacuriosities.networking.udp.streaming;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
public class AudioReceiver {
private static final int PORT = 8888;
public static void main(String[] args) {
Thread receiver = new AudioReceiverThread();
receiver.start();
}
// Este thread es el encargado de recibir y reproducir el audio
private static final class AudioReceiverThread extends Thread {
public void run() {
try (DatagramSocket socket = new DatagramSocket(PORT)){
while (true) {
byte buffer[] = new byte[32000];
DatagramPacket datagram = new DatagramPacket(buffer, buffer.length);
byte[] soundpacket = receiveAudio(socket, datagram);
reproduce(soundpacket);
}
} catch (SocketException e) {
// Log and Handle exception
e.printStackTrace();
}
}
private static byte[] receiveAudio(DatagramSocket sock, DatagramPacket datagram) {
try {
sock.receive(datagram);
return datagram.getData(); // soundpacket ;
} catch (Exception e) {
// Log and Handle exception
e.printStackTrace();
return null;
}
}
private static void reproduce( byte soundbytes[]) {
try {
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, AudioFormatHelper.getAudioFormat());
// El source data line se usa para escribir datos en el
SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(AudioFormatHelper.getAudioFormat());
sourceDataLine.start();
sourceDataLine.write(soundbytes, 0, soundbytes.length);
sourceDataLine.drain();
sourceDataLine.close();
} catch (Exception e) {
// Log and Handle exception
e.printStackTrace();
}
}
}
}